package com.ibeetl.cms.service;

import com.ibeetl.admin.console.service.DictConsoleService;
import com.ibeetl.admin.core.service.BaseService;
import com.ibeetl.admin.core.util.PlatformException;
import com.ibeetl.cms.dao.TelentCardDao;
import com.ibeetl.cms.entity.TelentCard;
import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * TelentCard Service
 */

@Service
@Transactional
public class TelentCardService extends BaseService<TelentCard>{

    @Autowired
    private TelentCardDao telentCardDao;
    @Autowired
    private DictConsoleService dictConsoleService;

    public PageQuery<TelentCard> queryByCondition(PageQuery query){
        PageQuery ret =  telentCardDao.queryByCondition(query);
        queryListAfter(ret.getList());
        return ret;
    }

    public void batchDelTelentCard(List<Long> ids){
        try {
            telentCardDao.batchDelTelentCardByIds(ids);
        } catch (Exception e) {
            throw new PlatformException("批量删除TelentCard失败", e);
        }
    }

    /**
     *
     * @param userId
     * @param salary 计税工资薪金
     * @param months 实际工作月数
     */
    public boolean generateCard(BigDecimal salary, int months, String name , String sex, String cardNumber,String socialCreditCode){
        double annualSalary = salary.doubleValue();
        TelentCard telentCard = new TelentCard();
        String level = "C";

        /** 人才卡等级根据薪金计算
         * 20200325 新业务调整规定为:
         * A级产业人才：年度大于等于60万，即平均月收入大于等于5万；
         * B级产业人才：大于等于22万，且小于60万。即平均月收入小于5万，大于等于1.8万；
         * C级产业人才：大于等于12万，且小于22万。即平均月收小于1.8万；
         */
        final int aLimit = 50000;
        final int bLimit = 18000;

        /**
         *  201909 新业务调整规定为:
         *  A级产业人才卡每年总积分30分
         *  B级产业人才卡每年总积分10分
         *  C级产业人才卡每年总积分5分
         */
        final int aScore = 30;
        final int bScore = 10;
        final int cScore = 5;

        int score;
        if(annualSalary/months >= aLimit){
            level = "A";
            score = aScore;
        }else if(annualSalary/months >= bLimit && annualSalary/months < aLimit){
            level = "B";
            score = bScore;
        }else if(annualSalary/months < bLimit){
            level = "C";
            score = cScore;
        }else{
            level = "C";
            score = cScore;
        }
        telentCard.setLevel(level);


        /**
         * 产业人才卡有效期为1年。
         * 生效时间固定为申请年度的3月1日，
         * 失效日期为第二年的2月28日，
         * 其产业人才卡在有效期截止日自动‘失效’。
         *
         * 变更
         * 人才卡有效期是从生效时间开始，是最终复审批量通过时间，有效期1年，现在的人才卡有效期时间设置那里要改。
         */
        String yearStr = dictConsoleService.getDeclareYear();
        //产业人才卡生效日期
        String telentStartDateStr = dictConsoleService.getTelentStartDate();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        //处理开始日期
        LocalDate telentStartDate =  LocalDate.parse(telentStartDateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        //通过开始日期计算截止日期-默认加一年
        LocalDate oneYearAfter = telentStartDate.plusYears(1).minusDays(1);
        try {
            //产业人才卡开始日期
            Date startDate = formatter.parse(telentStartDateStr);
            //截止日期
            Date endDate = formatter.parse(oneYearAfter.toString());
            telentCard.setStartdate(startDate);
            telentCard.setEnddate(endDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        /**
         * 产业人才卡发卡或重新入库时生成积分，工作不满一年的按实际工作月数计算积分。
         * 例如:张三（A级产业人才）上年度在现单位工作5个月，
         * 计算方式为：实际积分=总积分÷12个月×实际工作月数（20÷12×5=8.3）(四舍五入后，保留小数点后一位）。
         * 积分=年积分基数×上年有效月份/12。失效后的产业人才卡不再生成积分。
         */
        double finalScore = (months  * score / 12.0);
        /**
         * 累计积分计算方式:已有积分+本年度新增积分
         **/
        TelentCard telentCardOld = telentCardDao.findCardForApp(cardNumber);
        if(null != telentCardOld && null != telentCardOld.getScore()){
            Calendar calender = Calendar.getInstance();
            calender.setTime(telentCardOld.getStartdate());
            int oldYear = calender.get(calender.YEAR);
            if(oldYear == telentStartDate.getYear()){
                return false;
            }
            DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");

            double scoreOld = telentCardOld.getScore();
            BigDecimal bd1 = new BigDecimal(Double.toString(scoreOld));
            BigDecimal bd2 = new BigDecimal(Double.toString(finalScore));
            finalScore =  bd1.add(bd2).doubleValue();
        }
        telentCard.setScore(finalScore);

        //telentCard.setUserid((int) userId);
        telentCard.setName(name);
        telentCard.setGender(sex);
        /**
         * 按照申请年+产业人才卡生效时间+序号
         */
        Long nextOne = telentCardDao.allCount() + 1;
        String seq = yearStr.replace("-","") + nextOne.toString();
        telentCard.setCardNumber(cardNumber);
        telentCard.setSeq(seq);
       // telentCard.setId(String.valueOf(userId));
        telentCard.setCreateTime(new Date());

        telentCard.setSocialCreditCode(socialCreditCode);
        return this.save(telentCard);
    }


    //根据userId查最新的人才卡信息
    public TelentCard findCard(Long userId){
        return    telentCardDao.findCard(userId);
    }

    //根据userId查最早的人才卡信息
    public TelentCard findStartCard(Long userId){
        return    telentCardDao.findStartCard(userId);
    }


    /**
     *
     * @param
     * @param salary 计税工资薪金
     * @param months 实际工作月数
     */
    public boolean generateCardForApp(BigDecimal salary, int months, String name , String sex, String cardNumber, String socialCreditNumber){
        double annualSalary = salary.doubleValue();
        TelentCard telentCard = new TelentCard();
        String level = "C";

        /** 人才卡等级根据薪金计算
         * 20200325 新业务调整规定为:
         * A级产业人才：年度大于等于60万，即平均月收入大于等于5万；
         * B级产业人才：大于等于22万，且小于60万。即平均月收入小于5万，大于等于1.8万；
         * C级产业人才：大于等于12万，且小于22万。即平均月收小于1.8万；
         */
        final int aLimit = 50000;
        final int bLimit = 18000;

        /**
         *  201909 新业务调整规定为:
         *  A级产业人才卡每年总积分30分
         *  B级产业人才卡每年总积分10分
         *  C级产业人才卡每年总积分5分
         */
        final int aScore = 30;
        final int bScore = 10;
        final int cScore = 5;

        int score;
        if(annualSalary/months >= aLimit){
            level = "A";
            score = aScore;
        }else if(annualSalary/months >= bLimit && annualSalary/months < aLimit){
            level = "B";
            score = bScore;
        }else if(annualSalary/months < bLimit){
            level = "C";
            score = cScore;
        }else{
            level = "C";
            score = cScore;
        }
        telentCard.setLevel(level);


        /**
         * 产业人才卡有效期为1年。
         * 生效时间固定为申请年度的3月1日，
         * 失效日期为第二年的2月28日，
         * 其产业人才卡在有效期截止日自动‘失效’。
         *
         * 变更
         * 人才卡有效期是从生效时间开始，是最终复审批量通过时间，有效期1年，现在的人才卡有效期时间设置那里要改。
         */
        String yearStr = dictConsoleService.getDeclareYear();
        //产业人才卡生效日期
        String telentStartDateStr = dictConsoleService.getTelentStartDate();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        //处理开始日期
        LocalDate telentStartDate =  LocalDate.parse(telentStartDateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        //通过开始日期计算截止日期-默认加一年
        LocalDate oneYearAfter = telentStartDate.plusYears(1).minusDays(1);
        try {
            //产业人才卡开始日期
            Date startDate = formatter.parse(telentStartDateStr);
            //截止日期
            Date endDate = formatter.parse(oneYearAfter.toString());
            telentCard.setStartdate(startDate);
            telentCard.setEnddate(endDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        /**
         * 产业人才卡发卡或重新入库时生成积分，工作不满一年的按实际工作月数计算积分。
         * 例如:张三（A级产业人才）上年度在现单位工作5个月，
         * 计算方式为：实际积分=总积分÷12个月×实际工作月数（20÷12×5=8.3）(四舍五入后，保留小数点后一位）。
         * 积分=年积分基数×上年有效月份/12。失效后的产业人才卡不再生成积分。
         */
        double finalScore = (months  * score / 12.0);
        /**
         * 累计积分计算方式:已有积分+本年度新增积分
         **/
        TelentCard telentCardOld = telentCardDao.findCardForApp(cardNumber);
        if(null != telentCardOld && null != telentCardOld.getScore()){
            Calendar calender = Calendar.getInstance();
            calender.setTime(telentCardOld.getStartdate());
            int oldYear = calender.get(calender.YEAR);
            if(oldYear == telentStartDate.getYear()){
                return false;
            }
            DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");

            double scoreOld = telentCardOld.getScore();
            BigDecimal bd1 = new BigDecimal(Double.toString(scoreOld));
            BigDecimal bd2 = new BigDecimal(Double.toString(finalScore));
            finalScore =  bd1.add(bd2).doubleValue();
        }
        telentCard.setScore(finalScore);

        telentCard.setName(name);
        telentCard.setGender(sex);
        /**
         * 按照申请年+产业人才卡生效时间+序号
         */
        Long nextOne = telentCardDao.allCount() + 1;
        String seq = yearStr.replace("-","") + nextOne.toString();
        telentCard.setCardNumber(cardNumber);
        telentCard.setSeq(seq);
        telentCard.setCreateTime(new Date());
        telentCard.setSocialCreditCode(socialCreditNumber);
        return this.save(telentCard);
    }

    public TelentCard findCardForApp(String cardNumber) {
        return this.telentCardDao.findCardForApp(cardNumber);
    }
}